Ekplorasi Spotify Top Chart

Lagu Tahun 1970 - 2020

Updated: 2022-01-27

Author: Daniel Syahputra

Pengenalan

Apa itu Spotify?

Spotify merupakan layanan musik digital yang dapat memberikan kita jutaan lagu dari kreator di seluruh dunia. Spotify memudahkan dalam menemukan musik sesuai dengan preferensi penggunanya. Saat ini, terdapat jutaan lagu yang dapat didengar dari beberapa perangkat seperti ponsel, komputer, tablet, dll.

Spotify Top Chart

Setiap tahunnya, spotify memberikan daftar lagu-lagu yang termasuk kedalam kategori populer (top chart). Pada kali ini, kita akan mencoba mengeksplorasi bagaimana pola dari lagu-lagu yang dapat masuk ke dalam kategori top chart.

Dataset

Dataset yang digunakan berisikan lagu-lagu dari tahun 1970 hingga 2021 yang pernah memasuki top chart spotify. Berikut ini adalah informasi mengenai feature yang ada pada dataset:

Import Data dan Package

# Library yang akan digunakan
library(tidyverse)
library(readr)
library(ggplot2)
library(plotly)
spotify <- read.csv("datasets/spotify.csv")

Data Preparation

Inspeksi Data

Kita akan melihat bagaimana struktur dari data, dimensi data, serta tipe data yang digunakan. Hal ini akan sangat membantu kita dalam melakukan data preparation sebelum data digunakan dalam pemodelan machine learning.

# Inspeksi Struktur dan tipe data
glimpse(spotify)
## Rows: 1,270
## Columns: 16
## $ X             <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16…
## $ title         <chr> "Love The Way You Lie", "TiK ToK", "Bad Romance", "Just …
## $ artist        <chr> "Eminem", "Kesha", "Lady Gaga", "Bruno Mars", "Justin Bi…
## $ genre         <chr> "detroit hip hop", "dance pop", "dance pop", "pop", "can…
## $ year          <int> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 20…
## $ bpm           <int> 87, 120, 119, 109, 65, 120, 148, 93, 126, 128, 145, 130,…
## $ nrgy          <int> 93, 84, 92, 84, 86, 78, 76, 37, 72, 87, 83, 82, 83, 84, …
## $ dnce          <int> 75, 76, 70, 64, 73, 75, 52, 48, 79, 62, 62, 77, 83, 44, …
## $ dB            <int> -5, -3, -4, -5, -5, -4, -6, -8, -4, -4, -5, -5, -6, -8, …
## $ live          <int> 52, 29, 8, 9, 11, 4, 12, 12, 7, 6, 10, 70, 11, 12, 36, 1…
## $ val           <int> 64, 71, 71, 43, 54, 82, 38, 14, 61, 47, 48, 63, 71, 78, …
## $ dur           <int> 263, 200, 295, 221, 214, 203, 225, 216, 235, 235, 230, 2…
## $ acous         <int> 24, 10, 0, 2, 4, 0, 7, 74, 13, 3, 33, 18, 1, 1, 20, 5, 7…
## $ spch          <int> 23, 14, 4, 4, 14, 9, 4, 3, 4, 3, 4, 5, 4, 45, 3, 3, 7, 5…
## $ popularity    <int> 82, 80, 79, 78, 77, 77, 77, 76, 73, 73, 73, 73, 73, 72, …
## $ has_win_award <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…

Pengecekan Tipe Data

# Melihat jumlah unique value setiap kolom
spotify %>% 
  summarise_each(funs = n_distinct)
##     X title artist genre year bpm nrgy dnce dB live val dur acous spch
## 1 602  1192    589   137   66 126   96   79 23   76  96 234    99   45
##   popularity has_win_award
## 1         76             2

Dari informasi diatas, kita akan mengubah tipe data dari genre menjadi factor. Kita juga akan menghapus kolom X dikarenakan kolom ini merupakan kolom tambahan hasil merge dari beberapa dataset yang telah saya lakukan sebelumnya. Selain itu, kita juga akan mengubah tipe data dari has_win_award menjadi integer (diskret).

spotify <- spotify %>% 
  select(-X) %>% 
  mutate(genre = as.factor(genre), has_win_award = as.integer(has_win_award))

str(spotify)
## 'data.frame':    1270 obs. of  15 variables:
##  $ title        : chr  "Love The Way You Lie" "TiK ToK" "Bad Romance" "Just the Way You Are" ...
##  $ artist       : chr  "Eminem" "Kesha" "Lady Gaga" "Bruno Mars" ...
##  $ genre        : Factor w/ 137 levels "","acoustic blues",..: 82 77 77 131 57 77 77 111 25 77 ...
##  $ year         : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ bpm          : int  87 120 119 109 65 120 148 93 126 128 ...
##  $ nrgy         : int  93 84 92 84 86 78 76 37 72 87 ...
##  $ dnce         : int  75 76 70 64 73 75 52 48 79 62 ...
##  $ dB           : int  -5 -3 -4 -5 -5 -4 -6 -8 -4 -4 ...
##  $ live         : int  52 29 8 9 11 4 12 12 7 6 ...
##  $ val          : int  64 71 71 43 54 82 38 14 61 47 ...
##  $ dur          : int  263 200 295 221 214 203 225 216 235 235 ...
##  $ acous        : int  24 10 0 2 4 0 7 74 13 3 ...
##  $ spch         : int  23 14 4 4 14 9 4 3 4 3 ...
##  $ popularity   : int  82 80 79 78 77 77 77 76 73 73 ...
##  $ has_win_award: int  1 0 0 0 0 0 0 0 0 0 ...

Penanganan Missing Value

Missing value merupakan kondisi yang harus ditangani sebelum nantinya data digunakan untuk pemodelan. Alasan mengapa missing value perlu ditangani dikarenakan hal tersebut dapat mengurangi akurasi dari model machine learning.

spotify %>% 
  is.na() %>% 
  colSums()
##         title        artist         genre          year           bpm 
##             0             0             0             0             0 
##          nrgy          dnce            dB          live           val 
##             0             0             0             0             0 
##           dur         acous          spch    popularity has_win_award 
##             0             0             0             0             0

Berdasarkan hasil diatas, dataset kita saat ini tidak memiliki missing value.

Penanganan Data Duplikat

spotify %>% 
  distinct() %>% 
  dim()
## [1] 1265   15

Awalnya kita memiliki dataset dengan dimensi (1270, 15) dan setelah fungsi distinct() dijalankan dimensi dari dataset menjadi (1265, 15). Berarti, sebelumnya terdapat 5 baris yang teridentifikasi sebagai data duplikat. Kita akan menghapus semua baris yang teridentifikasi sebagai data duplikat.

spotify <- spotify %>% 
  distinct()

Exploratory Data Analysis

Korelasi Fitur Numerik

library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
spotify %>% 
  select_if(is.numeric) %>% 
  select(-has_win_award) %>% 
  ggcorr(label=T)

Siapa Artis Paling Populer?

popular_artist <- spotify %>% 
  group_by(artist) %>% 
  summarise(n_popular_song = n(), .groups = "drop") %>% 
  arrange(desc(n_popular_song)) %>% 
  head(15)
library(ggthemes)
library(glue)
popular_artist_plot <- popular_artist %>% 
  ggplot(aes(x = n_popular_song, 
             y = reorder(artist, n_popular_song),
             text = glue("Jumlah lagu populer: {n_popular_song}"))) +
  geom_segment( aes(x = 0, xend=n_popular_song, yend = artist), color="skyblue") +
  geom_point( color="orange", size=2.5, alpha=0.6) +
  theme_clean() + 
  theme(
    panel.grid.major.y = element_blank(),
    panel.border = element_blank(),
    axis.ticks.y = element_blank()
  ) + 
  labs(
    title = "Artist dengan Jumlah Lagu Populer Terbanyak",
    subtitle = "Tahun 1960an - 2020an",
    x = "Jumlah Lagu Populer",
    y = "Artist"
  )
ggplotly(popular_artist_plot, tooltip = "text")

Genre Lagu Apa yang Terkenal Pada Era Tertentu?

Feature Engineering

convert_year <- function(year) {
  if(year >= 2020) {
    year <- "2020an"
  } else if (year >= 2010) {
    year <- "2010an"
  } else if (year >= 2000) {
    year <- "2000an"
  } else if (year >= 1990) {
    year <- "1990an"
  } else if (year >= 1980) {
    year <- "1980an"
  } else if (year >= 1970) {
    year <- "1970an"
  } else if (year >= 1960) {
    year <- "1960an"
  } else {
    year <- "Sebelum 1960"
  }
}
# Membuat kolom baru 'era'
spotify$era <- sapply(X = spotify$year, 
                      FUN = convert_year)
spotify$era <- as.factor(spotify$era)
popular_genre <- spotify %>% 
  group_by(era, genre) %>% 
  summarise(mean_popularity = mean(popularity), .groups = "drop") %>% 
  ungroup() %>% 
  arrange(desc(mean_popularity))
popular_genre[match(unique(popular_genre$era), popular_genre$era), ]
## # A tibble: 7 × 3
##   era          genre           mean_popularity
##   <fct>        <fct>                     <dbl>
## 1 2010an       escape room                90  
## 2 2000an       permanent wave             82  
## 3 1980an       glam metal                 81.5
## 4 1990an       atl hip hop                79  
## 5 1970an       british folk               74  
## 6 1960an       baroque pop                71  
## 7 Sebelum 1960 adult standards            49.1